package com.penghaisoft.microwms.product.web.controller.insidewarehouse;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.penghaisoft.microwms.common.Constant;
import com.penghaisoft.microwms.common.controller.BaseController;
import com.penghaisoft.microwms.common.dto.Resp;
import com.penghaisoft.microwms.common.dto.TransResult;
import com.penghaisoft.microwms.common.page.Pager;
import com.penghaisoft.microwms.common.service.IWmsCommonService;
import com.penghaisoft.microwms.common.wms.model.ProContractChangePlan;
import com.penghaisoft.microwms.product.service.IProContractChangePlanService;

import lombok.extern.slf4j.Slf4j;

/**
 * @Package com.penghaisoft.microwms.product.web.controller.insidewarehouse
 * @ClassName: ProContractChangePlanController
 * @Description: 成品合同变更计划表
 * @author luoteng
 * @date 2019年3月7日 下午5:35:16
 */
@RestController
@RequestMapping(value = "/proContractChangePlan")
@Slf4j
public class ProContractChangePlanController extends BaseController {

	@Autowired
	private IProContractChangePlanService iProContractChangePlanService;

	@Autowired
	private IWmsCommonService wmsCommonService;

	/**
	 * @Description: TODO
	 * @param @param page
	 * @param @param rows
	 * @param @param proContractChange
	 * @param @return
	 * @return TransResult
	 * @author lengxf
	 * @date 2018年9月14日 下午4:45:17
	 */
	@PostMapping("list")
	public TransResult list(@RequestParam(name = "page", defaultValue = "1") int page,
			@RequestParam(name = "rows", defaultValue = "10") int rows, ProContractChangePlan proContractChangePlan) {
		Pager<ProContractChangePlan> result = iProContractChangePlanService.findListByCondition(page, rows,
				proContractChangePlan);
		return success(result);
	}

	/**
	 * @Description 原材料合同借用创建
	 * @copy luoteng
	 * @param list
	 * @return TransResult
	 */
	@PostMapping("insert")
	public TransResult create(@RequestBody List<ProContractChangePlan> list) {
		TransResult transResult = new TransResult();
		if (list == null || list.isEmpty()) {
			transResult.setCode(Constant.FAIL);
			transResult.setMsg("请选择型号及数量！");
			return transResult;
		} else {
			String sellOutNo = wmsCommonService
					.getProShortSeq5(Constant.SEQ_PREFIX_SHORT_CJY, Constant.SEQ_PREFIX_SHORT_REDIS_PRO_CJY, 1).get(0);
			Resp resp = iProContractChangePlanService.insert(list, sellOutNo, getLoginName());
			transResult.setCode(resp.getCode());
			transResult.setMsg(resp.getMsg());
		}

		return transResult;
	}

	/**
	 * @Title: audit
	 * @Description: 原材料合同借用审核
	 * @date 2019年3月6日 下午3:24:21
	 * @author luoteng
	 * @param proContractChangePlan
	 * @return TransResult
	 */
	@PostMapping("audit")
	public TransResult audit(ProContractChangePlan proContractChangePlan) {
		TransResult transResult = new TransResult();
		proContractChangePlan.setLastModifiedBy(getLoginName());
		proContractChangePlan.setGmtModified(new Date());

		ProContractChangePlan ob = new ProContractChangePlan();
		ob.setActiveFlag("1");
		ob.setContractChangePlanNo(proContractChangePlan.getContractChangePlanNo());

		List<ProContractChangePlan> list = iProContractChangePlanService.queryListByAny(ob);
		if (list != null && !list.isEmpty()) {
			ProContractChangePlan tmp = list.get(0);
//				状态：0：创建 1：通过 2：驳回 3：扫码中 4：扫码完成 5：确认完成
			if (tmp.getStatus().equals("3") || tmp.getStatus().equals("4") || tmp.getStatus().equals("5")) {
				transResult.setCode(Constant.FAIL);
				transResult.setMsg("只有创建、通过、驳回状态下才能审核！");
				return transResult;
			}
		}

		ob.setStatus(proContractChangePlan.getStatus());
		ob.setLastModifiedBy(getLoginName());
		ob.setGmtModified(new Date());

		Resp resp = iProContractChangePlanService.updateByPlanNo(ob);
		transResult.setCode(resp.getCode());
		transResult.setMsg(resp.getMsg());
		return transResult;
	}

	/**
	 * @Title: del
	 * @Description: 原材料合同借用 删除
	 * @date 2019年3月6日 下午3:24:51
	 * @author luoteng
	 * @param proContractChangePlan
	 * @return TransResult
	 */
	@PostMapping("del")
	public TransResult del(ProContractChangePlan proContractChangePlan) {
		TransResult transResult = new TransResult();
		transResult.setCode(Constant.SUCCESS);
		ProContractChangePlan ob = new ProContractChangePlan();
		ob.setActiveFlag("1");
		ob.setProContractChangePlanId(proContractChangePlan.getProContractChangePlanId());

		List<ProContractChangePlan> list = iProContractChangePlanService.queryListByAny(ob);
		if (list != null && !list.isEmpty()) {
			ProContractChangePlan tmp = list.get(0);

//	 			状态：0：创建 1：通过 2：驳回 3：扫码中 4：扫码完成 5：确认完成
			if (!tmp.getStatus().equals("0")) {
				transResult.setCode(Constant.FAIL);
				transResult.setMsg("只有创建状态下才能删除！");
				return transResult;
			}

//	 			BigDecimal realAmount = tmp.getAmount() == null ? BigDecimal.ZERO : tmp.getAmount();
//	 			
//	 			if(realAmount.compareTo(BigDecimal.ZERO) > 0){
//	 				transResult.setCode(Constant.FAIL);
//	 				transResult.setMsg("发货中的销售出库单不能删除！若想删除，请先通知仓库退扫已扫码记录！");
//	 				return transResult;
//	 			}
		}

		proContractChangePlan.setActiveFlag("0");
		proContractChangePlan.setLastModifiedBy(getLoginName());
		proContractChangePlan.setGmtModified(new Date());
		try {
			iProContractChangePlanService.update(proContractChangePlan);
		} catch (RuntimeException e) {
			transResult.setCode(Constant.FAIL);
			transResult.setMsg(e.getMessage());
		}

		return transResult;
	}

	/**
	 * @Title: getInfo
	 * @Description: 根据主键查看详情【归还用】
	 * @date 2019年3月6日 下午5:11:25
	 * @author luoteng
	 * @param proContractChangePlanId
	 * @return TransResult
	 */
	@GetMapping("get/id/{proContractChangePlanId}")
	public TransResult getInfo(@PathVariable("proContractChangePlanId") String proContractChangePlanId) {
		TransResult transResult = new TransResult();
		transResult.setCode(Constant.SUCCESS);

		ProContractChangePlan ob = new ProContractChangePlan();
		ob.setActiveFlag("1");
		ob.setProContractChangePlanId(Integer.parseInt(proContractChangePlanId));

		List<ProContractChangePlan> list = iProContractChangePlanService.queryListByAny(ob);
		if (list != null && !list.isEmpty()) {
			ProContractChangePlan tmp = list.get(0);
//	 			状态：0：创建 1：通过 2：驳回 3：扫码中 4：扫码完成 5：确认完成
			if (!tmp.getStatus().equals("5")) {
				transResult.setCode(Constant.FAIL);
				transResult.setMsg("只有确认完成状态下才能归还！");
				return transResult;
			}
			transResult.setData(tmp);
		}

		return transResult;
	}

	/**
	 * @Title: back
	 * @Description: 归还
	 * @date 2019年3月6日 下午5:35:18
	 * @author luoteng
	 * @param proContractChangePlan
	 * @return TransResult
	 */
	@PostMapping("back/update")
	public TransResult back(ProContractChangePlan proContractChangePlan) {
		TransResult transResult = new TransResult();

		String sellOutNo = wmsCommonService
				.getProShortSeq5(Constant.SEQ_PREFIX_SHORT_CJY, Constant.SEQ_PREFIX_SHORT_REDIS_PRO_CJY, 1).get(0);

		Resp resp = iProContractChangePlanService.backUpdate(proContractChangePlan, sellOutNo, getLoginName());
		transResult.setCode(resp.getCode());
		transResult.setMsg(resp.getMsg());

		return transResult;
	}

	/**
	 * @Title: makeNewBarCode
	 * @Description: 成品借用条码重新打印
	 * @author Lengxf
	 * @date 2019年3月28日
	 */
	@PostMapping("makeNewBarCode")
	public TransResult makeNewBarCode(ProContractChangePlan proContractChangePlan) {
		// rawContractChangePlan 对象接收新合同号和类型两个字段，确定为一条数据
		TransResult result = new TransResult();
		Resp resp = iProContractChangePlanService.makeNewBarcode(proContractChangePlan);
		result.setCode(resp.getCode());
		result.setMsg(resp.getMsg());
		return result;
	}

	/**
	 * @Title: getInfo
	 * @Description: 根据主键查看详情【修改用】
	 * @date 2019年3月6日 下午5:11:25
	 * @author luoteng
	 * @param proContractChangePlanId
	 * @return TransResult
	 */
	@GetMapping("edit/get/id/{proContractChangePlanId}")
	public TransResult getEditInfo(@PathVariable("proContractChangePlanId") String proContractChangePlanId) {
		TransResult transResult = new TransResult();
		transResult.setCode(Constant.SUCCESS);

		ProContractChangePlan ob = new ProContractChangePlan();
		ob.setActiveFlag("1");
		ob.setProContractChangePlanId(Integer.parseInt(proContractChangePlanId));

		List<ProContractChangePlan> list = iProContractChangePlanService.queryListByAny(ob);
		if (list != null && !list.isEmpty()) {
			ProContractChangePlan tmp = list.get(0);
//	 			状态：0：创建 1：通过 2：驳回 3：扫码中 4：扫码完成 5：确认完成
			if (tmp.getStatus().equals("5")) {
				transResult.setCode(Constant.FAIL);
				transResult.setMsg("确认完成状态下不能修改！");
				return transResult;
			}
			transResult.setData(tmp);
		}

		return transResult;
	}

	/**
	 * @Title: planUpdate
	 * @Description: 修改
	 * @date 2019年4月2日 上午11:32:27
	 * @author luoteng
	 * @param proContractChangePlan
	 * @return TransResult
	 */
	@PostMapping("edit/update")
	public TransResult planUpdate(ProContractChangePlan proContractChangePlan) {
		TransResult transResult = new TransResult();
		transResult.setCode(Constant.SUCCESS);

		ProContractChangePlan ob = new ProContractChangePlan();
		ob.setActiveFlag("1");
		ob.setProContractChangePlanId(proContractChangePlan.getProContractChangePlanId());

		List<ProContractChangePlan> list = iProContractChangePlanService.queryListByAny(ob);
		if (list != null && !list.isEmpty()) {
			ProContractChangePlan tmp = list.get(0);
			BigDecimal realAmount = tmp.getAmount() == null ? BigDecimal.ZERO : tmp.getAmount();
			BigDecimal modiAmount = proContractChangePlan.getRequireAmount() == null ? BigDecimal.ZERO
					: proContractChangePlan.getRequireAmount();
//				状态：0：创建 1：通过 2：驳回 3：扫码中 4：扫码完成 5：确认完成
			if (tmp.getStatus() != null && tmp.getStatus().equals("5")) {
				transResult.setCode(Constant.FAIL);
				transResult.setMsg("状态为确认完成的合同变更单不能修改！");
				return transResult;
			} else if (realAmount.compareTo(modiAmount) > 0) {
				transResult.setCode(Constant.FAIL);
				transResult.setMsg("合同变更单中该型号的需求数量不能修改小于当前实际数量！");
				return transResult;
			}

			if (!tmp.getModel().equals(proContractChangePlan.getModel())) {
				if (realAmount.compareTo(BigDecimal.ZERO) > 0) {
					transResult.setCode(Constant.FAIL);
					transResult.setMsg("扫码中的合同变更单不能修改型号！若想修改型号，请先通知仓库退扫已扫码记录！");
					return transResult;
				}
			}
		}

		proContractChangePlan.setLastModifiedBy(getLoginName());
		proContractChangePlan.setGmtModified(new Date());
		try {
			iProContractChangePlanService.updateNew(proContractChangePlan);
		} catch (RuntimeException e) {
			transResult.setCode(Constant.FAIL);
			transResult.setMsg(e.getMessage());
		}

		return transResult;
	}
}
